Soru & Cevap

Android'de Sayıyı Yazıya Çevirme

20.10.2015 - 10:11

Arkadaşlar merhaba bir konuda fikirlerinize ihtiyacım var. Belirli bir aralıkta sayıyı yazıya çevirmek istiyorum. Mesela 100 TL gireceğim edittext'e ve textview'de bunu Yüz TL olarak yazdırmak istiyorum. Aynı mantıkla Yüz yazıp bu sefer 100 yazdırmak istiyorum. Fikirlerinizi bekliyorum.

Teşekkürler. 

413 Görüntülenme

5 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-28812-1452251417.jpg
umutonur
13.11.2015 - 02:06

Farklı başlıkları araştırırken kendimi burda buldum :) 
Başlık açılalı 3 hafta olmuş ama şöyle bir algoritmada belki birilerinin işine yarar.

public class sayidanYaziya {
    public String[] birler = new String[]{"", "Bir", "İki", "Üç", "Dört", "Beş", "Altı", "Yedi", "Sekiz", "Dokuz"};
    public String[] onlar = new String[]{"", "On ", "Yirmi ", "Otuz ", "Kırk ", "Elli ", "Altmış ", "Yetmiş ", "Seksen ", "Doksan "};
    public String[] yuzler = new String[]{"", "Yüz ", "İkiyüz ", "Üçyüz ", "Dörtyüz ", "Beşyüz ", "Altıyüz ", "Yediyüz ", "Sekizyüz ", "Dokuzyüz "};
    public String[] basamak = new String[]{"", " Bin ", " Milyon ", " Milyar ", " Trilyon "};

    public String cevir(String sayi) {
        if (sayi.matches("[0-9]*")) {
            return yazdir(Integer.parseInt(sayi));
        } else {
            return "Sadece rakamlardan oluşan bir değer girmelisiniz!!!";
        }
    }
    public String yazdir(int sayi) {
        String sonuc = "";
        if (sayi > 0) {
            sonuc = basamaklarinaAyir(sayi);
        } else if (sayi < 0) {
            sonuc = "Eksi " + basamaklarinaAyir(Math.abs(sayi));
        } else {
            sonuc = "Sıfır";
        }
        return sonuc;
    }

    public String basamaklarinaAyir(int sayi) {
        String sonuc = "", s = String.valueOf(sayi);
        int i = s.length();
        int b = i, x, n = 0;
        while (i > 0) {
            b = (b > 3 ? i - 3 : 0);
            sonuc = ayir(s.substring(b, i)) + basamak[n] + sonuc;
            i = i - 3;
            n++;
        }
        if (sonuc.matches("(Bir) Bin ([A-Za-zğüşıöçĞÜŞİÖÇ[\\s]]*)")) {
            Pattern p = Pattern.compile("(Bir) Bin ([A-Za-zğüşıöçĞÜŞİÖÇ[\\s]]*)");
            Matcher m = p.matcher(sonuc);
            if (m.find()) {
                sonuc = "Bin " + m.group(2);
            }
        }
        return sonuc;
    }
    public String ayir(String s) {
        String sonuc = "";
        int i = s.length();
        switch (i) {
            case 3:
                sonuc = yuzler[Integer.parseInt(String.valueOf(s.charAt(i - 3)))];
            case 2:
                sonuc = sonuc + onlar[Integer.parseInt(String.valueOf(s.charAt(i - 2)))];
            case 1:
                sonuc = sonuc + birler[Integer.parseInt(String.valueOf(s.charAt(i - 1)))];
            default:
        }
        return sonuc;
    }
}

farkındayım kod biraz dağınık oldu.. :) 
(koddan da anlamışsındır) sadece tam sayılar için çalışır, virgüllü sayılarda hata verir.


String deger = Object.cevir("123456"); 

şeklinde kullanabilirsin. 

yok ben zaten direkt int türünde bir tamsayı girecem dersen direkt;

deger = Object.yazdir(123456);

şeklinde de kullanılabilir..

Profile picture for user tunahantolga
tunahantolga
20.10.2015 - 05:52

Teşekkürler arkadaşlar, Stackoverflow'da araştırmıştım bulamamıştım fakat daha sonradan farkettim, burada ki çözüm yolları işime yaradı. Link:

picture-63168-1603920322.png
serkan1987
20.10.2015 - 12:29

bunun için geniş kapsamlı bir algoritma yazman gerekiyor çünkü kullanıcı 1.232,443 yazdığında da metne çevirmen gerekebilir.

picture-19298-1459404577.jpg
alper_beyler
20.10.2015 - 11:09

merhabalar,

öncelikle aralığı belirlersin atıyorum 1den 100 e kadar diyelim bunu string.xml klasöründe yazarsın array şeklinde sayılara karşılık gelen yazıları tutarsın. Daha sonra kod içinde edittext e kullanıcı 100 TL girdi diyelim bu değeri alıyorsun sonra split ile boşluğu almayıp 100 değerini alıyorsun sonra integer a  çeviriyorsun ve aşağıdaki gördüğün gibi numbers ile kontrol ediyorum onu array şeklinde yazabilirsin ben tek değer için aşağıda belirttim başta oluşturmuş olduğun number_text içinde for ile kontrolu yapıp ekrana bastırıyorsun. umarım yardımcı olur , kolay gelsin

<string-array name="number_text">
        <item >Bir TL</item>
        <item >İki TL</item>
        <item >Üç TL</item>
           .
           .
           .
        <item >Yüz TL</item>
    </string-array>

 

String[] numberText = getResources().getStringArray(R.array.number_text);
String str = editText.getText().toString();
String arr[] = str.split(" ");
numbers = Integer.parseInt(arr[0]);

for(int i=0; i<numberText.length; i++){

       if(i+1 == numbers){
           yourTextview.setText(numberText[i].toString());
           break;

              }

      }

 

picture-7730-1383655584.png
egemen.durmus
20.10.2015 - 10:41



int i = 1234;

String str = Integer.toString(i);
şeklinde deneyebilirsin olmazsa yine yardımcı olurum :)

 

Alper Gökhan Beyler
20.10.2015 - 11:11
böyle yaparsan sadece 1234 değerini string tipinde yazar. bin ikiyüz otuz dört basmaz.